#include <stdio.h>
#include <stdlib.h>
// #include "mySeqList.h"//注意导入这个自己写的头文件

#define MAX 100      //定义顺序表的容量
#define datatype int //定义元素的数据类型
struct sqlist
{
    datatype a[MAX]; //元素数组
    int length;      //顺序表的当前长度
};
typedef struct sqlist SEQLIST;

// typedef struct sqlist{
//     datatype a[MAX];//元素数组
//     int length;//顺序表的当前长度
// }SEQLIST;

/*之后下面是函数的声明，具体函数的实现要在myseqlist.c里面来实现*/
//顺序表的序号从1开始
SEQLIST *init_seqlist();                           //顺序表的初始化 ，建立一个空的顺序表
int insert_seqlist(SEQLIST *L, int i, datatype x); /*在顺序表中的第i个元素之前插入新的元素x，表长加1，并返回1；不成功返回0*/
int delete_seqlist(SEQLIST *L, int i);             /*删除顺序表中的第i个元素，表长减1，并返回1；不成功返回0*/
int location_seqlist(SEQLIST *L, datatype x);      /*返回顺序表中值为x的元素的序号，若无，返回0 */
int get_seqlist(SEQLIST *L, int i);                /* 返回顺序表中第i个元素的值，若i大于表长，返回0 */
void print_seqlist(SEQLIST *L);                    //输出顺序表

int main(int argc, char *argv[])
{
    SEQLIST *sq; //这个变量为头文件里面的用户自定义类型SEQLIST
    int fanhui;  //代表各个操作函数的返回值
    int i, a;    //i循环变量,a输入的数

    sq = init_seqlist(); //初始化顺序表

    for (i = 0; i < 10; i++) //循环10次，往顺序表中插入10个数
        fanhui = insert_seqlist(sq, (i + 1), 10 * (i + 1));
    printf("插入之后");
    print_seqlist(sq);
    printf("顺序表的长度为：%d\n", sq->length);

    printf("请输入要删除数的序号：");
    scanf("%d", &a);
    delete_seqlist(sq, a);
    printf("删除第%d个元素之后", a);
    print_seqlist(sq);
    printf("顺序表的长度为：%d\n", sq->length);

    printf("请输入要在顺序表查找的元素的值：");
    scanf("%d", &a);
    fanhui = location_seqlist(sq, a);
    if (fanhui == 0)
        printf("查找不成功，没有这个数！\n");
    else
        printf("查找成功，是第%d个数！\n", fanhui);

    printf("请输入要在顺序表查找的元素的序号：");
    scanf("%d", &a);
    fanhui = get_seqlist(sq, a);
    if (fanhui == 0)
        printf("查找不成功，查找序号不合法！\n");
    else
        printf("查找成功，第%d个元素值为：%d\n", a, fanhui);

    system("PAUSE");
    return 0;
}

SEQLIST *init_seqlist()
{
    SEQLIST *l;
    l = (SEQLIST *)malloc(sizeof(SEQLIST));
    l->length = 0;
    return l;
}
/*在顺序表中的第i个元素之前插入新的元素x，表长加1，并返回1；不成功返回0*/
int insert_seqlist(SEQLIST *L, int i, datatype x)
{
    if (i > MAX || i < 1)
    {
        printf("插入的位置不合法");
        return 0;
    }
    int k;
    for (k = L->length; k >= i; k++)
    {
        L->a[k] = L->a[k - 1];
    }
    L->a[i - 1] = x;
    L->length++;
    return 1;
}

/*删除顺序表中的第i个元素，表长减1，并返回1；不成功返回0*/
int delete_seqlist(SEQLIST *L, int i)
{
    if (i < 1 || i > L->length)
    {
        printf("不存在%d个元素", i);
    }
    int k;
    for (k = i; k < L->length; k++)
    {
        L->a[k - 1] = L->a[k];
    }
    L->length--;
    return 1;
}

/*返回顺序表中值为x的元素的序号，若无，返回0 */
int location_seqlist(SEQLIST *L, datatype x)
{
    int index = 0;
    while (index < L->length && L->a[index] != x)
    {
        index++;
    }
    if (index != L->length)
        index++;
    return index;
}

/* 返回顺序表中第i个元素的值，若i大于表长，返回0 */
int get_seqlist(SEQLIST *L,int i){
    if (i<1 || i>L->length)
    {
        return 0;
    }
    return L->a[i - 1];
}

//输出顺序表
void print_seqlist(SEQLIST *L){
    if (L->length == 0)
    {
        printf("这是一个空表");
    }else
    {
        int i;
        for (i=0;i<L->length;i++)
            printf("%5d",L->a[i]);
    }
    printf("\n");
}
